/**************************************************************************************
*
*	Copyright (C) 2010 - 2012 Brent Andrew O. Chua - See LICENSE.txt for more info.
*		
*	Filename	-	Classes.h
*
*	Description -	Forward declaration of all classes in Pulse engine.
*
*	Comments	-	There's like a hundred more classes I need to include here but i'm
*					too lazy to add them all right now m'kay?
*
*	Modification History:
*			Name			   Date					Description
*			MrCodeSushi	-	05/29/2010		-	File creation
**************************************************************************************/

#ifndef _PSX_CLASSES_H_
#define _PSX_CLASSES_H_

#include "Platform.h"

namespace Pulse
{
	// Forward class declarations
	//////////////////////////////

	class Engine;

	// Application class
	class IApplication;
	class WindowsBaseApplication;
	class ConsoleApplication;
	class WindowApplication;

	// Pulse container classes
	template < typename T >
	class Array;
	template < typename T >
	class BinaryTree;
	template< typename K, typename T, typename Trait, typename Hash >
	class HashTable;
	template < typename T >
	class List;
	template < typename T >
	class LList;
	template < typename K, typename T, typename Trait >
	class Map;
	template < typename T, typename Trait >
	class PriorityQueue;
	template < typename T >
	class Queue;
	template < typename T, typename Trait >
	class Set;
	template < typename T, typename Trait >
	class SortedLList;
	template < typename T >
	class Stack;

	// Utility classes
	class Clock;
	class FPSCounter;
	class FPSAutoCounter;
	class String;
	class IRegistryObject;
	class Registry;
	class RegisterClassRAII;
	template < typename T >
	class SmartPointer;
	template < typename T >
	class WeakPointer;

	// I/O Classes
	class Stream;
	class IStream;
	class OStream;
	class FileIO;
	class XMLParser;
	class XMLElement;
	typedef SmartPointer<XMLElement> XMLElementPtr;
	class XMLDocument;
	typedef SmartPointer<XMLDocument> XMLDocumentPtr;
	class XMLAttribute;
	typedef SmartPointer<XMLAttribute> XMLAttributePtr;

	// Math classes
	class Box;
	class FastFloat;
	class Math;
	class Matrix3x3;
	class Matrix4x4;
	class Random;
	class Vector2;
	class Vector3;
	class Vector4;

	// Systems/Manager classes
	class PulseScript;
	class ResHandle;
	class ResourceCache;
	class ResourceFile;
	class FileSystem;
	class ProcessManager;
	class IEventData;
	class EventSystem;
	class InputSystem;
	class IInputDevice;
	class IKeyboardDevice;
	class IMouseDevice;
	class VertexBuffer;
	class TaskScheduler;

	// Physics System
	struct CollisionData;
	class IPhysicsSystem;
		class BulletPhysics;

	// Multi-Threading
	template < BOOL bTry >
	class _MutexLocker;
	typedef _MutexLocker< FALSE > MutexLocker;
	typedef _MutexLocker< TRUE > MutexTryLocker;
	class Thread;
	class ThreadWorker;
	class TaskStatus;
	class ThreadTask;
	class TaskScheduler;
	class AsyncLoadResource;
	class AsyncFor;

	// Resource manager classes
	class IResourcePoolItem;
	template < typename T >
	class ResourcePool;
	class ResourceManager;

	// Graphics
	class GraphicsInfrastructure;
	class GraphicsDevice;
	struct RendererDesc;
	class Renderer;
	struct DisplayMode;
	class GraphicsPipeline;
	typedef Array<DisplayMode> DisplayModeList;

	// Graphics - Render Paths
	class RenderPathLightPrePass;

	// Graphics - Resources
	struct BufferDesc;
	class Buffer;
	class ShaderResource;
	class GraphicsBuffer;
	struct StructuredBufferDesc;
	class StructuredBuffer;
	struct ConstantBufferDesc;
	class ConstantBuffer;
	struct StructuredBufferDesc;
	class StructuredBuffer;
	struct VertexBufferDesc;
	class VertexBuffer;
	struct IndexBufferDesc;
	class IndexBuffer;
	struct Texture2DDesc;
	class Texture2D;
	struct SwapChainDesc;
	class SwapChain;

	// Graphics - Resource Views
	class DepthStencilViewDesc;	
	class ShaderResourceViewDesc;
	class UnorderedAccessViewDesc;

	// Graphics - Shaders
	struct ShaderDesc;
	class Shader;
	class VertexShader;
	class HullShader;
	class DomainShader;
	class GeometryShader;
	class PixelShader;
	class ComputeShader;
	class Effect;
	class RenderTechnique;
	class RenderPass;
	class EffectsLibrary;

	// Graphics - Pipeline
	class GrpahicsPipeline;
	class ShaderStageState;
	struct MappedResource;
	class InputLayout;
	class InputAssemblerStage;
	class VertexShaderStage;
	class HullShaderStage;
	class TesellatorStage;
	class DomainShaderStage;
	class GeometryShaderStage;
	class StreamOutputStage;
	class RasterizerStage;
	class PixelShaderStage;
	class OutputMergerStage;
	
	// Graphics - Parameter System
	class ParameterSystem;
	class IParameter;
	class ParameterScalar;
	class ParameterMatrix;
	class ParameterMatrixRef;
	class ParameterMatrixArray;
	class ParameterShaderResource;
	class ParameterVector3;
	class ParameterVector4;
	class ParameterSamplerState;
	class ParameterConstantBuffer;
	class IParameterBinder;
	class ParameterBinderScalar;
	class ParameterBinderVector3;
	class ParameterBinderVector4;
	class ParameterBinderMatrixRef;
	class ParameterBinderMatrixRef;
	class ParameterBinderMatrixArray;
	class ParameterBinderShaderResource;
	class ParameterBinderTexture2D;
	class ParameterBinderConstantBuffer;
	class ParameterContainer;
	
	// Graphics -  States
	class BlendState;
	class DepthStencilState;
	class RasterizerState;
	class SamplerState;

	// Graphics - Rendering
	struct GeometrySubset;
	class Geometry;
	class Material;
	class Model;
	class Light;
	class RenderView;

	// Graphics - Render Entries
	class RenderEntryList;
	class RenderEntry;
	class RenderEntryClearPipeline;
	class RenderEntryRenderTarget;
	class RenderEntryDepthStencilState;
	class RenderEntryClearRenderBuffers;
	class RenderEntryModel;
	class RenderEntryProjection;
	class RenderEntryView;
	class RenderEntryViewport;
	class RenderEntryBindParameters;
	class RenderEntryLight;
	class RenderEntryWindowViewPresent;
	class RenderEntryPresent;
	class RenderEntrySwapChain;
	class RenderEntryDispatchCompute;

	// Graphics - Render Paths
	class RenderPathLightPrePass;
	class CameraRenderPathSettingsLPP;
	class CameraRenderPathSettingsFP;
	class RenderPathForwardPlus;

	// Graphics - Scene
	class Scene;
	class FactoryActor;

	// Events
	class IEvent;
	class EventKeyboardInput;
	class EventKeyUp;
	class EventKeyDown;
	class EventMouseMove;
	class EventMouseButtonUp;
	class EventMouseButtonDown;
	class EventTransform;
	class EventModelLoaded;
	class EventModelUnloaded;
	class EventRender;
	class EventWindowing;
	class EventWindowViewResize;
	class EventWindowViewDestroy;
	class EventComponentBase;
		class EventComponentAdd;
		class EventComponentRemove;

	// Actor
	class	Actor;
	typedef UINT ActorID;
	typedef UINT ComponentID;
	typedef SmartPointer<Actor> ActorPtr;
	typedef WeakPointer<Actor> ActorWeakPtr;
	typedef ActorWeakPtr ActorWPtr;

	// Actor Component System
	class FactoryComponent;
	class IComponent;
	typedef SmartPointer<IComponent> ComponentPtr;
	class ComponentContainer;
	class ComponentTransform;
	class ComponentCamera;
	class ComponentModelFilter;
	class ComponentModelRenderer;
	class ComponentLight;
	class ComponentPhysics;
	class ComponentReflection;
	class ComponentNativeScript;	

		// Native Script Components
		class FacotoryNativeScript;
		class _INativeScript;
		template < typename DerivedScriptType >
		class INativeScript;
		class CSCameraControlFreeRoam;

	// Windowing System
	class WindowingSystem;
	class Window;
	class WindowView;

	// Application
	class Application;
	class Logic;
	class View;
	struct AppMsg;

}

#endif /* _PSX_CLASSES_H_ */